package cn.demoncat.util.redis.entity;

import cn.demoncat.util.lang.constant.StringConstant;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * Redis Key 常量
 *
 * 场景：直接管理的缓存
 * 
 * @author 延晓磊
 *
 * @since 2020年1月15日
 */
public class RedisKey{

	// 缓存键/键前缀
	private String key;
	// 过期秒数：-1表示不过期
	private int exp;

	public RedisKey() {
		super();
	}

	/**
	 * 是否为永不过期
	 *
	 * @return
	 */
	public boolean isPersist(){
		return exp <= 0;
	}

	/**
	 * 常量
	 * 
	 * @param pre	键前缀
	 * @param exp	到期时间
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月15日
	 */
	public RedisKey(String pre, int exp) {
		super();
		this.key = pre;
		this.setExp(exp);
	}

	/**
	 * 常量（永久）
	 * 
	 * @param key	键前缀
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月15日
	 */
	public RedisKey(String key) {
		super();
		this.key = key;
		this.exp = -1;
	}
	
	/**
	 * 构建
	 * 
	 * @param id	拼接在pre后
	 * 
	 * @return 新的RedisKey
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月15日
	 */
	public RedisKey build(Object ...id) {
		if (ArrayUtils.isEmpty(id)) {
			return new RedisKey(this.getKey(), this.getExp());
		}else {
			if (id.length == 1) {
				return new RedisKey(this.getKey() + id[0], this.getExp());
			}else{
				return new RedisKey(this.getKey() + StringUtils.join(id, StringConstant.COLON), this.getExp());
			}
		}
	}
	
	/**
	 * 获取Key
	 * 
	 * @param id	拼接在pre后
	 * 
	 * @return this.pre + id
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年1月15日
	 */
	public String key(Object ...id) {
		if (ArrayUtils.isEmpty(id)) {
			return this.getKey();
		}else {
			if (id.length == 1) {
				return this.getKey() + id[0];
			}else{
				return this.getKey() + StringUtils.join(id, StringConstant.COLON);
			}
		}
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public int getExp() {
		return exp;
	}

	/**
	 * 到期时间，-1表示永久
	 *
	 * @param exp
	 * @return
	 */
	public RedisKey setExp(int exp) {
		if (exp <= 0) {
			exp = -1;
		}
		this.exp = exp;
		return this;
	}

}
